<?php


/*
$msb = 0;
$lsb = 4;
$level = 4;
$flags = 0 | 128 | 64;
$client_id = 'asldjfl';
$username  = 'xj123';
$password  = '123456';

$payload = chr($msb) . chr(4) . 'MQTT' 
		   . chr($level) . chr($flags) . chr(0) . chr(0) 
		   . chr(0) . chr(strlen($client_id)) . $client_id 
		   . chr(0) . chr(0) 
		   . chr(0) . chr(0) 
		   . chr(0) . chr(strlen($username)) . $username
		   . chr(0) . chr(strlen($password)) . $password;
$len     = strlen($payload);
$reps    = chr(0x10) . chr($len) . $payload;
*/

/*

MQTT中的Remaining Length计算方式（php版）

MQTT中的Remaining Length，最大长度为4个字节。 
其中每个字节的第一位为 “是否有后续字节” 的状态位。 
如果有设置该状态位为1，没有则设置为0。

估可用小于或等于4个字节来表示 MQTT包的长度（该4位不计入在包大小范围，因此忽略计入）。

*/

function numerical2Binary($number)
{
    $char = [];

    $first = 0;
    $next  = $number;
    $key   = 0;
    do {
        $first = $next % 128;
        $next  = intval($next / 128);

        $char[$key] = $first;
        if ($next > 0) {
            $char[$key] |= 128;
        }

        ++$key;
    } while($next > 0);

    return $char;
}

$result = numerical2Binary(128);
var_dump($result);
foreach ($result as $key => $value) {
    printf("%08b \n", $value);
}